import { def } from './utils'
import defineReactive from './defineReactive'
import { arrayMethods } from './array'
import observe from './observe'
import Dep from './Dep'

// Observer类的目的是:将一个正常的object转换为每个层级的属性都是响应式(可以被侦测)的object
export default class Observer {
  constructor(value) {
    // 每一个Observer的实例成员中都有一个Dep的实例
    // 由于循环调用的原因,所以数据的每一层都会有一个dep(普通值不算)
    // 将dep绑到__ob__上
    this.dep = new Dep()

    // 给实例(this,一定要注意,构造器中的this不是表示类本身,而是表示实例)添加__ob__属性,值是这次new的实例
    def(value, '__ob__', this, false)

    // 检查他是数组还是对象
    if (Array.isArray(value)) {
      // 如果是数组:将这个数组的原型指向arrayMethods
      Object.setPrototypeOf(value, arrayMethods)
      //将数组变为observe
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }
  // 遍历
  walk(value) {
    for (let k in value) {
      // console.log(k) a,m,n,b,g
      defineReactive(value, k)
    }
  }
  // 数组的特殊遍历
  observeArray(arr) {
    for (let i = 0, l = arr.length; i < l; i++) {
      // 逐项进行递归
      observe(arr[i])
    }
  }
}
